#ifndef _LSTACK_H_
#define _LSTACK_H_
#include"utili.h"

#define LinkStackElem_Type char




typedef struct LinkStackNode {
	LinkStackElem_Type data;
	LinkStackNode* next;
}LinkstackNode;
typedef LinkStackNode* LinkStack;





bool LinkStackEmpty(LinkStack pst);
void LinkStackInit(LinkStack* pst);
void LinkStackPush(LinkStack* pst, LinkStackElem_Type v);
void LinkStackPop(LinkStack* pst);
LinkStackElem_Type LinkStackTop(LinkStack* pst);
void LinkStackShow(LinkStack* pst);
void LinkStackDestroy(LinkStack* pst);


bool LinkStackEmpty(LinkStack pst) {
	return pst == NULL;
}
void LinkStackInit(LinkStack* pst) {
	*pst = NULL;
}
void LinkStackPush(LinkStack* pst, LinkStackElem_Type v) {
	LinkStackNode* p = (LinkStackNode*)malloc(sizeof(LinkStackNode));
	assert(p);
	p->data = v;
	p->next = *pst;
	*pst = p;
}
void LinkStackPop(LinkStack* pst) {
	if (LinkStackEmpty(*pst)) {
		LinkStackNode* p = *pst;
		*pst = (*pst)->next;
		free(p);
	}
}
LinkStackElem_Type LinkStackTop(LinkStack pst) {

	if (LinkStackEmpty(pst)) {
		
		return pst->data;
	}
}
void LinkStackShow(LinkStack* pst) {
	if (*pst == NULL)
		return;
	LinkStackNode* p = *pst;
	while (p) {
		printf("%c \n",p->data );
		p = p->next;
	}
	
}
void LinkStackDestroy(LinkStack* pst) {
	LinkStackNode* p = *pst;
	while (p) {
		p = p->next;
		free(*pst);
		*pst = p;
	}

}

//#define stackelem_type char
//
//
//
//typedef struct stacknode {
//
//	stackelem_type data;
//
//	struct stacknode* next;
//
//}stacknode;
//
//typedef stacknode* stack;
//
//
//
//bool empty(stack ps) {
//
//	return ps == null;
//
//}
//
//
//
//void destroy(stack* ps);
//
//void init(stack* ps);
//
//void push(stack* ps, stackelem_type v);
//
//void pop(stack* ps);
//
//stackelem_type top(stack ps);
//
//
//
//void destroy(stack* ps) {
//
//	struct stacknode* p = *ps;
//
//	while (*ps) {
//
//		*ps = (*ps)->next;
//
//		free(p);
//
//		p = *ps;
//
//	}
//
//}
//
//
//
//void init(stack* ps) {
//
//	*ps = null;
//
//}
//
//void push(stack* ps, stackelem_type v) {
//
//	stacknode* p = (stacknode*)malloc(sizeof(stacknode));
//
//	assert(p);
//
//	p->data = v;
//
//	p->next = *ps;
//
//	*ps = p;
//
//}
//
//void pop(stack* ps) {
//
//	assert(ps != null && !empty(*ps));
//
//	struct stacknode* p = *ps;
//
//	*ps = (*ps)->next;
//
//	free(p);
//
//}
//
//
//
//stackelem_type top(stack ps) {
//
//	assert(ps != null && !empty(ps));
//
//	return ps->data;
//
//}




#endif // !_LSTACK_H_

